/**
 * Represente une lettre
 * Contient le caractère et la probabilité que cette lettre soit dans le mot final
 * @author Marie-Hélène Goddet, Damien Finck, Cédric Schaller
 * 
 */
package fastwriting;

import utils.Debug;

public class Lettre {
	//Probabilité des lettres en français
	static final double[] probaAlphabet =
	{
		8.11,0.81,3.38,4.28,17.69,1.13,1.19,0.74,7.24,0.18,0.02,5.99,2.29,7.68,5.20,2.92,0.83,6.43,8.87,
		7.44,5.23,1.28,0.06,0.53,0.26,0.12
	};
	private char car;
	private double proba;		// getProba() donne le calcul des time,changementDirection,postionCentre
	private int time;						// Damien : done
	/* plage de valeur : 0 <= x <= infini
	 * plus c'est grand : mieux c'est
	 * fiabilité : faible (les noobs font des pauses n'importe où et plombent les résultats)
	 */
	private double changementDirection;	// Damien : a peu près
	/* plage de valeur : 0 <= x <= 1
	 * plus c'est grand : mieux c'est
	 * 0 : pas de changement de direction : ligne droite
	 * 1 : demi-tour totale
	 * 0.5 : angle de 90°
	 * fiabilité : moyen (les noobs sont paniqués et savent pas où aller)
	 */
	private double centreTouche;			// Damien : a peu près
	/* plage de valeur : 0 <= x <= Math.sqrt(30^2+25^2) =~ 39.051
	 * plus c'est faible : mieux c'est
	 * fiabilité : élevée (les noobs sont lents et vont passer doucement sur le milieu de la touche
	 * 						et les douées passeront assez bien dessus car ils auront compris que c'est fort ! :p)
	 */
	
	private boolean endLetter;
	
	/**
	 * Constructeur créant un objet de proba 0
	 * @param c le caractère représenté par la lettre
	 */
	public Lettre(char c) {
		this(c,-1);
	}
	
	/**
	 * Constructeur
	 * @param car le caractère
	 * @param proba la probabilité
	 */
	public Lettre(char car,double proba) {
		this.setCar(car);
		this.setProba(proba);
		this.time = 0;
		this.setChangementDirection(0);
		this.setCentreTouche(40);
		this.endLetter = false;
	}
	
	/**
	 * Change le caractère
	 * @param car le nouveau caractère
	 */
	public void setCar(char car) {
		this.car = car;
	}
	
	/**
	 * Renvoiz le caractère
	 * @return le caractère
	 */
	public char getCar() {
		return car;
	}
	/**
	 * Modifie la probabilité
	 * @param proba la nouvelle probabilité
	 */
	public void setProba(double proba) {
		this.proba = proba;
	}
	/**
	 * Calcule la probabilité si ce n'est pas deja fait
	 * @return une nombre représentant la probabilité de la présence de la lettre dans le mot voulu
	 * 			proba est compris entre -0.1 et 4
	 */
	public double getProba() {
		if (proba == -1) { //Calcule si pas deja calculé
			double pAlphabet;
			int idx = Character.toLowerCase(this.getCar())-'a';
			if (idx>=0 && idx <=26){
				pAlphabet = Lettre.probaAlphabet[idx]/100;
			} else {
				pAlphabet = 0;
			}
			Debug.addLog("Proba alphabet de la lettre "+this.getCar()+" : "+pAlphabet,Debug.LOG_INFO,"proba");
			
			
			proba = ((double)getTime())/40 + getChangementDirection() + (double)(40 -getCentreTouche())/40 +pAlphabet -0.3;
			if (endLetter){
				proba+=0.2;
			}
			Debug.addLog("proba lettre "+car+" "+proba, Debug.LOG_INFO, "proba");
			Debug.addLog("time / 40 "+((double)getTime())/40+" , chgt Direction "+getChangementDirection()+" centreTouche "+(double)(40 -getCentreTouche())/40, Debug.LOG_INFO, "proba");

		}
		return proba;
	}
	
	/**
	 * Retourne le temps passé sur la lettre
	 * @return le temps passé sur la lettre
	 */
	public int getTime() {
		return time;
	}
	/**
	 * Rajoute un au temps passé (si un point était sur la lettre)
	 */
	public void addTime() {
		this.time++;
	}
	/**
	 * Indique un nombre entre 0 et 1 indiquant si on a changé de direction 
	 * @param changementDirection le changement de direction
	 */
	public void setChangementDirection(double changementDirection) {
		this.changementDirection = Math.max(changementDirection,this.changementDirection);
	}
	/**
	 * Getter
	 * @return le changement de direction
	 */
	public double getChangementDirection() {
		return changementDirection;
	}
	/**
	 * Indique si on est passé près du centre de la touche
	 * @param centreTouche un nombre entre 0 et 40
	 */
	public void setCentreTouche(double centreTouche) {
		this.centreTouche = centreTouche;
	}
	/**
	 * Retourne un nombre représentant la proximité du centre de la touche
	 * @return centreTouche
	 */
	public double getCentreTouche() {
		return centreTouche;
	}
	/**
	 * Indique si cette lettre était la lettre de fin de la saisie
	 * @param b true si c'est la lettre de fin
	 */
	public void endLetter(boolean b) {
		this.endLetter = true;
	}
	/**
	 * Getter
	 * @return true si la lettre est la lettre de fin de la saisie, false sinon
	 */
	public boolean isEndLetter(){
		return endLetter;
	}
}